import os, sys, platform
from func import *

# 获取当前操作系统
os_type = platform.system()


class Console(object):

    # 定义私有字段 接受参数
    _args_dict = {}

    def __init__(self, args_dict):
        self._args_dict = args_dict

    def _clear_screen(self):
        # 检测操作系统
        # macOS 和 Linux
        if os_type in ["Linux", "Darwin"]:
            os.system("clear")
        else:
            os.system("cls")

    def _checkMutexOpt(self):
        # 当 _mutex_opt 中 都是False的时候
        if all(self._args_dict[opt["value"]] == False for opt in mutex_opt) or all(
            self._args_dict[opt["value"]] == True for opt in mutex_opt
        ):
            self._clear_screen()
            print("未输入候选项，请在以下列表中进行选择：")
            # 显示 _mutex_opt 中的值 横向排列，给出序号
            # 形如 1. export 2. dml 默认为 2
            for index, opt in enumerate(mutex_opt):
                print(f"{index + 1}. {opt['label']}")

            # 等待用户输入序号
            while True:
                try:
                    index = int(input("请输入序号: "))
                except ValueError:
                    print("请输入有效数值")
                    continue
                except KeyboardInterrupt:
                    print("\n退出程序。")
                    sys.exit()  # 直接退出程序
                if index < 1 or index > len(mutex_opt):
                    print("请在可选项中输入序号")
                    continue
                break
        else:
            # 获取 mutex_opt为True的下标
            index = [
                i
                for i, v in enumerate(mutex_opt)
                if self._args_dict[v["value"]] == True
            ][0] + 1

        # 根据序号获取对应的值
        opt = mutex_opt[index - 1]

        return opt

    def _checkExtraParam(self):
        self._clear_screen()
        print("相关参数设置，如果需要改动，请输入对应序号进行修改，q 保存退出")
        # 显示现有其他参数内容 拼接 序号 extra_params 对应的值
        for index, param in enumerate(extra_params):
            print(f"{index + 1}. {param['label']}：{self._args_dict[param["value"]]}")

        # 等待用户输入序号 或者Ctrl+C 或者 q
        param_index = None
        while True:
            try:
                input_val = input("请输入序号或键入q: ")
                if input_val == "q":
                    self._clear_screen()
                    break

                param_index = int(input_val)
            except ValueError:
                print("请输入有效数值！")
                continue
            except KeyboardInterrupt:
                print("\n退出程序。")
                sys.exit()  # 直接退出程序
            if param_index < 1 or param_index > len(extra_params):
                print("请在可选项中输入序号！")
                continue
            break

        if param_index is not None:
            extra_param = extra_params[param_index - 1]
            while True:
                try:
                    input_str = input(f"{extra_param['label']}：")
                    
                except KeyboardInterrupt:
                    self._checkExtraParam()
                    return
                
                if (
                    extra_param["func"](
                        self._args_dict, extra_param["value"], input_str
                    )
                    == False
                ):
                    continue

                break

            # 递归调用该方法
            self._checkExtraParam()

    # 定义内部方法 用于分析参数显示菜单
    def _display_menu(self):

        opt = self._checkMutexOpt()

        self._checkExtraParam()

        # 执行对应的方法
        opt["func"](self._args_dict)


def displayMenu(args_dict):
    console = Console(args_dict)
    console._display_menu()
